﻿using System;
namespace Lesson11_练习题
{
    class Program
    {
        #region 练习一
        //传入一个值，递归求该值的阶乘
        static int GetFact1(int num)
        {
            if (num == 1)
            {
                return 1;
            }
            return num * GetFact1(num - 1);
            //num*GetFact(num - 1)
            //(num - 1)*GetFact(num - 2)
            //......
            //2*GetFact(1)
            //return 1
        }
        #endregion

        #region 练习二
        //使用递归求1到10到阶乘
        static int GetFact2(int num)
        {
            if (num == 1)
            {
                return 1;
            }
            return GetFact1(num) + GetFact2(num - 1);
            //num阶乘 + GetFact(num - 1)
            //num - 1阶乘 + GetFact(num - 2)
            //......
            //2阶乘 + GetFact(1)
            //return 1
        }
        #endregion

        #region 练习三
        //一棵竹子长100米，每天砍断一半，使用递归求第10天竹子长度
        //这里使用参数默认值传入了可选参数index作为计数器记录天数，因为index的初始值固定且无具体含义，调用函数时不必传入index
        static void GetLength(float length, int day, int index = 0)
        {
            if (day <= 0)
            {
                Console.WriteLine("第{0}天竹子长度为{1}米", index, length);
                return;
            }
            length /= 2;
            day--;
            index++;
            GetLength(length, day, index);
        }
        #endregion

        #region 练习四
        //不能使用 循环语句 和 条件语句 ，打印1 ～ 200
        //
        static bool Print(int num)
        {
            Console.WriteLine(num);
            return num == 200 || Print(num + 1);
        }
        #endregion

        static void Main(string[] args)
        {
            #region 练习一
            Console.WriteLine(GetFact1(5));
            #endregion

            #region 练习二
            Console.WriteLine(GetFact2(10));
            #endregion

            #region 练习三
            GetLength(100f, 10);
            #endregion

            #region 练习四
            Print(1);
            #endregion
        }
    }
}
